今天要來介紹寫程式裡面很重要的函數,為什麼重要呢?因為基本上寫程式都靠它,那函數是什麼呢?你把函數想成就是一個動作,大家都有打過遊戲吧,遊戲裡面打怪的時候是不是可以選擇要用普通攻擊、技能或法術。那函數就是你選擇的方法,你選擇要用這個普通攻擊、技能或法術來攻擊眼前的怪物。
如果你不打遊戲,跟我一樣崇尚修仙的話,那想必也看過不少武俠小說、漫畫,那函數在裡面就像是功法,心訣。
武功有內外功那函數就跟他們一樣都是一種攻法,那功法裡面怎樣催動怎樣運行,就由撰寫的人來述說了。
所以函數也是相同的,就是由你來撰寫他裡面怎樣運行,有需要用到的時候拿出來使用。
好的,有個基本的理解後那我們來看一下官方文件的例子。
func greet(person: String) -> String {
let greeting = "Hello, " + person + "!"
return greeting
}
這個例子,寫了一個方法 greet(person: String) 這個方法呢要帶一個 person 的參數型別是 String 的型別,那他後面的 -> String 又是什麼呢? 那個的意思就是,這個方法最後會返回一個 String 型別的結果回來。這樣這個方法就是,我給你一個人名,然後這個方法會回來給我一串文字。
所以裡面的 let greeting = "Hello, " + person + "!" 就是他中間轉換的過程,所以最後會返回一個 Hello, 加上我給的人名 + !
所以接下來如果調用他就可以像下面的例子一樣。
print(greet(person: "Anna"))
// 打印“Hello, Anna!”
print(greet(person: "Brian"))
// 打印“Hello, Brian!”
然後再寫程式裡就會長下面這樣
func greetAgain(person: String) -> String {
return "Hello again, " + person + "!"
}
print(greetAgain(person: "Anna"))
// 打印“Hello again, Anna!”
函數參數和返回值在Swift中非常靈活。您可以定義任何東西,從具有單個未命名參數的簡單實用程式函數到具有表達性參數名稱和不同參數選項的複雜函數。
既然知道了一點撰寫的皮毛,那其實函數也可以不帶參數來寫方法。
func sayHelloWorld() -> String {
return "hello, world"
}
print(sayHelloWorld())
// 打印“hello, world”
雖然沒有帶參數但是呢,他還是會返回一個文字回來,那就只要在方法裡面 return 加上字串就好。
那 return 就是前面一篇,講到 控制轉移 講到的其中一項。
函數也可以帶多種參數進去,讓這些參數涵括在括號之中,用逗號分隔即可。
func greet(person: String, alreadyGreeted: Bool) -> String {
if alreadyGreeted {
return greetAgain(person: person)
} else {
return greet(person: person)
}
}
print(greet(person: "Tim", alreadyGreeted: true))
// 打印“Hello again, Tim!”
從上面可以看到,這一個函數帶了 person, alreadyGreeted 這兩個參數,分別是 String 跟 Bool 型別,然後他們最後會返回一個文字字串。
那最後那一行 print 裡面的方法寫上了 Tim, true 就是他們所帶的參數了。
然後裡面的 greetAgain(person: person) 與 greet(person: person) 這兩個方法,他們帶的參數就是最上層 greet(person: String, alreadyGreeted: Bool) 裡面的 person (用斜體分別) 為值。
函數呢其實也可以沒有返回值。
func greet(person: String) {
print("Hello, \(person)!")
}
greet(person: "Dave")
// 打印“Hello, Dave!”
一上面的例子來看,把原本的返回值拿掉了,直接在方法裡面直接印出要出的字串。
但嚴格來說其實有返回一個值,只是是返回一個 Void 類型的特殊值,該值為一個空元組,寫成()
像下面這樣
func greet(person: String) -> Void{
print("Hello, \(person)!")
}
greet(person: "Dave")
// 打印“Hello, Dave!”
接下來說另一個狀況,就是調用函數時有時候可以忽略該函數的返回值,以官方的例子來看
func printAndCount(string: String) -> Int {
print(string)
return string.count
}
func printWithoutCounting(string: String) {
let _ = printAndCount(string: string)
}
printAndCount(string: "hello, world")
// 打印“hello, world”,并且返回值 12
printWithoutCounting(string: "hello, world")
// 打印“hello, world”,但是没有返回任何值
第一個函數被調用的時候會返回一個 12 Int型別的數值回來。
第二個函數調用了第一個函數,可是忽略的他的返回值,所以第二個函數輸出時不會有 12 這個返回值輸出出來。
但是要注意的是,返回值可以忽略但是如果第一個函數有定義返回值那還是要返回該函數所定義的返回值給他不然系統編譯時會爆出錯誤。
好的,今天就先到這裡,明天再來慢慢加深函數的不同狀況。